
#include "Barril.h"
#include <iostream>
#include <algorithm>

const int EstadoBarril::Explotando = 0;
const int EstadoBarril::SinParticular = 1;
const vector<int> EstadoBarril::acciones = make_vector<int>() << EstadoBasico::Movimiento;
const vector<string> EstadoBarril::descripcionAcciones = make_vector<string>() << "rodar";
const vector<int> EstadoBarril::accionesParticulares = make_vector<int>() << EstadoBarril::Explotando;
const vector<string> EstadoBarril::descripcionAccionesParticulares = make_vector<string>() << "explotar";

Barril::Barril(int x, int y, int maximoX, int maximoY, Orientacion orientacion) : ObjetoMovible(x, y, maximoX, maximoY, orientacion) {

	if (orientacion == Derecha)
		estadoDerecha = Empezo;
	else // if (orientacion == Izquierda)
		estadoIzquierda = Empezo;
		
	estado = EstadoBasico::Movimiento;
	estadoParticular = EstadoBarril::SinParticular;
	prioridad = 3;
	tipo = ENEMIGO;
	ultimaVelocidadZero = false;
	srand (time(NULL));
}

void Barril::setEstadoParticular(int estado) {
	estadoParticular = estado;
}

void Barril::Explotar() {
	estadoParticular = EstadoBarril::Explotando;
	estadoDerecha = SinMovimiento;
	estadoIzquierda = SinMovimiento;
}

void Barril::Actualizar(Uint32 time) {

	randCambioSentido();

	if (estadoDerecha == Moviendo) {
		MoverDerecha(maximoX, time - lastTimeActualizar);
		if (getX() > maximoX) {
			Explotar();
		}
	}
	
	if (estadoIzquierda == Moviendo) {
		MoverIzquierda(time - lastTimeActualizar);
		if (getX() + getAncho() < 0){
			Explotar();
		}
	}
	
	if (estadoDerecha == Empezo) {
		estadoDerecha = Moviendo;
		setEstado(EstadoBasico::Movimiento);
	}
	
	if (estadoIzquierda == Empezo) {
		estadoIzquierda = Moviendo;
		setEstado(EstadoBasico::Movimiento);
	}

}

void Barril::addAccionParticular(int idImagen, int cuadros) {
	Animacion *animacion = new Animacion (cuadros, 0, idImagen, ancho, alto);
    accionesParticulares.push_back(animacion);
}

pair<idImagen_t, int> Barril::getDibujable(Uint32 time) {
	
	pair<idImagen_t, int> dibujable;
	
	if (estadoParticular == EstadoBarril::SinParticular) {
		dibujable = ObjetoMovible::getDibujable(time);
	}
	else {
		bool status = true;
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
		if (!status) {
			estadoVida = Muerto;
		}
	}
	
	return dibujable;
}

int Barril::indexEstado(int estado) {
	
	vector<int> estados = EstadoBarril::acciones;
	
	unsigned int posicion = find(estados.begin(), estados.end(), estado) - estados.begin();
	
	if (posicion >= estados.size())
		return -1;
		
	return posicion;
}

void Barril::randCambioSentido() {

	if (getVelocidadY() == 0 && !ultimaVelocidadZero) {

		if (estadoDerecha == SinMovimiento && estadoIzquierda == SinMovimiento) CambiarSentido(1,1, true);
		else {
			int cambio = rand() % 2;
			if (cambio) CambiarSentido(1, 1, true);
		}
	}

	if (getVelocidadY() != 0) ultimaVelocidadZero = false;
	else ultimaVelocidadZero = true;
}

void Barril::Morir() {
	Explotar();
}

void Barril::Detener() {
	estadoDerecha = SinMovimiento;
	estadoIzquierda = SinMovimiento;
}

void Barril::ColisionarConPersonaje (ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja) {

	Personaje* per = dynamic_cast<Personaje*> (personaje);

	per->StartSonido (SonidosPersonaje::Colision);

	if (estadoParticular == EstadoBarril::Explotando) return;
	per->setInvencibilidad(false);
	per->restarVida();
	per->RestarPuntos(PUNTOS_RESTAR);
	Explotar();
}

void Barril::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja) {

	ObjetoMovible* mov = dynamic_cast<ObjetoMovible*> (movible);

	if (getPrioridad() < mov->getPrioridad()) mov->ColisionarConEnemigo(this, colX, colY, colXvieja, colYvieja);

	if (movible->getEstadoVida() == Muerto) return;

	else if (movible->getTipo() == BONUS) return;

	else {
		if (mov->getPrioridad() == 2) { /**esto es cualquieraaaaa! :( pero es la unica manera q encontre rapida**/
			if (static_cast<Tortuga*>(movible)->getEstadoParticular() == EstadoTortuga::Escapando)
				Explotar();
		}
		else mov->Morir();
	}
}
